import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// 创建一个 axios 实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 请求的基础 URL = 基础地址 + 请求地址
  // withCredentials: true, // 跨域请求时发送 Cookie
  timeout: 5000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在请求发送之前做点什么

    if (store.getters.token) {
      // 让每个请求携带 token
      // ['X-Token'] 是自定义请求头键
      // 请根据实际情况修改
      config.headers['Authorization'] = 'Bearer ' + getToken()
    }
    return config
  },
  error => {
    // 处理请求错误
    console.log(error) // 方便调试
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果你想获得 HTTP 信息，比如头部或状态码
   * 请返回 response => response
   */



  /**
   * 根据自定义代码判断请求状态
   * 这里只是示例
   * 你也可以通过 HTTP 状态码来判断
   */
  response => {

    const res = response.data

    // 如果自定义代码不是 200，则判定为错误
    if (res.code !== '200' && res.code !== 200) {
      Message({
        message: res.message || '错误',
        type: 'error',
        duration: 5 * 1000
      })

      // 5001: Token过期；50012: 其他客户端登录了
      if (res.code === '5001' || res.code === 50012 || res.code === 50014) {
        // 重新登录
        MessageBox.confirm('你已被登出，可以取消留在该页面，或者重新登录', '确认登出', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || '错误'))
    } else {
      return res.data
    }
  },
  error => {
    console.log('error,', error)

    if (error.response) {
      const status = error.response.status
      const data = error.response.data

      // FastAPI 错误格式通常为 { detail: "错误信息" } 或 { detail: [{loc:..., msg:...}] }
      let errorMsg = '请求失败'
      if (status === 404) {
        errorMsg = '不存在的资源路径'
      } else if (typeof data.detail === 'string') {
        errorMsg = data.detail
      } else if (Array.isArray(data.detail)) {
        // 处理 FastAPI 的验证错误（422）数组格式
        errorMsg = data.detail.map(err => err.msg).join('; ')
      }

      // 弹出提示
      Message({
        message: errorMsg,
        type: 'error',
        duration: 5 * 1000
      })
    } else {
      // 网络错误或服务器无响应
      Message({
        message: '网络错误或服务器无响应',
        type: 'error',
        duration: 5 * 1000
      })
    }

    return Promise.reject(error)
  }
)

export default service
